/**
 * Copyright (c) 2013-2022 Nikita Koksharov
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.redisson.config;

/**
 * @author Nikita Koksharov
 */
public class SingleServerConfig extends BaseConfig<SingleServerConfig> {

    /**
     * redis server 地址
     */
    private String address;

    /**
     * 这段代码声明了一个私有的整型变量database，用于指定Redis连接所使用的数据库索引。
     * 初始值为0，表示默认数据库。
     */
    private int database = 0;

    /**
     * 订阅连接的最小空闲尺寸
     * 该字段是一个私有成员变量，用于设定订阅连接的最小空闲数量。
     * 默认值为1，表示至少保持一个连接处于空闲状态以备使用。
     */
    private int subscriptionConnectionMinimumIdleSize = 1;

    /**
     * 订阅连接池大小的默认值。
     * 此属性定义了订阅连接池的最大容量，默认为50。
     * 这个值可以根据实际需求进行调整，以管理并发订阅者的数量。
     */
    private int subscriptionConnectionPoolSize = 50;

    /**
     * 设定最小空闲Redis连接数。
     * 此属性用于配置Redis客户端保持的最小空闲连接数，以确保系统能够快速响应高并发请求。
     * 默认值为24。
     */
    private int connectionMinimumIdleSize = 24;


    /**
     * 此字段定义了Redis连接的最大池大小。
     * 连接池大小是一个关键配置，它决定了可以同时保持的最大Redis连接数。
     * 这个值应该根据应用的并发量和Redis服务器的承载能力来合理配置。
     * 默认值为64，适用于大多数情况，但在高并发场景下可能需要调整。
     */
    private int connectionPoolSize = 64;



    /**
     * 该变量定义了DNS检查的间隔时间，
     * 单位为毫秒，默认值为5000毫秒。
     * 这个间隔时间用于控制程序多长时间对DNS进行一次查询检测。
     */
    private long dnsMonitoringInterval = 5000;


    SingleServerConfig() {
    }

    SingleServerConfig(SingleServerConfig config) {
        super(config);
        setAddress(config.getAddress());
        setConnectionPoolSize(config.getConnectionPoolSize());
        setSubscriptionConnectionPoolSize(config.getSubscriptionConnectionPoolSize());
        setDnsMonitoringInterval(config.getDnsMonitoringInterval());
        setSubscriptionConnectionMinimumIdleSize(config.getSubscriptionConnectionMinimumIdleSize());
        setConnectionMinimumIdleSize(config.getConnectionMinimumIdleSize());
        setDatabase(config.getDatabase());
    }


    public SingleServerConfig setConnectionPoolSize(int connectionPoolSize) {
        this.connectionPoolSize = connectionPoolSize;
        return this;
    }
    public int getConnectionPoolSize() {
        return connectionPoolSize;
    }


    public SingleServerConfig setSubscriptionConnectionPoolSize(int subscriptionConnectionPoolSize) {
        this.subscriptionConnectionPoolSize = subscriptionConnectionPoolSize;
        return this;
    }
    public int getSubscriptionConnectionPoolSize() {
        return subscriptionConnectionPoolSize;
    }

    public SingleServerConfig setAddress(String address) {
        if (address != null) {
            this.address = address;
        }
        return this;
    }
    public String getAddress() {
        return address;
    }


    public SingleServerConfig setDnsMonitoringInterval(long dnsMonitoringInterval) {
        this.dnsMonitoringInterval = dnsMonitoringInterval;
        return this;
    }
    public long getDnsMonitoringInterval() {
        return dnsMonitoringInterval;
    }


    public SingleServerConfig setSubscriptionConnectionMinimumIdleSize(int subscriptionConnectionMinimumIdleSize) {
        this.subscriptionConnectionMinimumIdleSize = subscriptionConnectionMinimumIdleSize;
        return this;
    }
    public int getSubscriptionConnectionMinimumIdleSize() {
        return subscriptionConnectionMinimumIdleSize;
    }


    public SingleServerConfig setConnectionMinimumIdleSize(int connectionMinimumIdleSize) {
        this.connectionMinimumIdleSize = connectionMinimumIdleSize;
        return this;
    }
    public int getConnectionMinimumIdleSize() {
        return connectionMinimumIdleSize;
    }


    public SingleServerConfig setDatabase(int database) {
        this.database = database;
        return this;
    }
    public int getDatabase() {
        return database;
    }

}
